﻿using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using Billing2;
using System.IO;
using System.Configuration;

public class Prompt : Exception
{
    public Prompt(string message)
        : base(message)
    {

    }
}

public class Common
{
    public const int AdjustmentReportTemplateID = 0;

    public static bool ValidFileName(string file_name)
    {
        return System.Text.RegularExpressions.Regex.IsMatch(file_name, @"[-_\.0-9a-zA-Z\u4e00-\u9fa5]+");
    }

    public static bool ValidFieldName(string field_name)
    {
        return System.Text.RegularExpressions.Regex.IsMatch(field_name, @"[_0-9a-zA-Z\u4e00-\u9fa5]+");
    }

    public static bool ValidSeachValue(string seach_value)
    {
        return System.Text.RegularExpressions.Regex.IsMatch(seach_value, @"[-_/0-9a-zA-Z\u4e00-\u9fa5]*");
    }

    public static bool ValidStoreProcedureName(string sp_name)
    {
        return System.Text.RegularExpressions.Regex.IsMatch(sp_name, @"[_0-9a-zA-Z\u4e00-\u9fa5]+");
    }

    public static bool ValidEmail(string input)
    {
        Regex match = new Regex("^(?(\")(\".+?\"@)|(([0-9a-zA-Z]((\\.(?!\\.))|[-!#\\$%&'\\*\\+/=\\?\\^`\\{\\}\\|~\\w])*)(?<=[0-9a-zA-Z])@))(?(\\[)(\\[(\\d{1,3}\\.){3}\\d{1,3}\\])|(([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,6}))$", RegexOptions.IgnoreCase);
        if (!match.IsMatch(input))
        {
            return false;
        }
        return true;
    }

  

    public static string EncryptData(string data)
    {
        return ClsPasswordHelper.Encrypt(data);
    }

    public static string DecryptData(string data)
    {
        return ClsPasswordHelper.Decrypt(data);
    }

    //public static string GetSessionID()
    //{
    //    return HttpContext.Current.Session.SessionID;
    //}

    //public static string GetSessionID()
    //{
    //    return HttpContext.Current.Session == null ? "" : HttpContext.Current.Session.SessionID;
    //}

    public static string CreateToken()
    {
        string token = MyLib.Rand.RandomDigitLowercaseUppercase(10);
        HttpContext.Current.Session["token"] = token;
        string s = ClsPasswordHelper.Encrypt(token + "EPPPortal").Replace("=", "").Replace("/", "").Replace("+", "");
        return s;
    }

    public static bool ValidToken(string token)
    {
        string mytoken = "";
        if (HttpContext.Current.Session["token"] != null)
            mytoken = HttpContext.Current.Session["token"].ToString();
        string s = ClsPasswordHelper.Encrypt(mytoken + "EPPPortal").Replace("=", "").Replace("/", "").Replace("+", "");
        return (token == s);
    }

    public static string EscapeFilename(string input)
    {
        //data = data.Replace("\\", "");
        //data = data.Replace("/", "");
        //data = data.Replace("\"", "");
        //data = data.Replace("'", "");
        //data = data.Replace("<", "(");
        //data = data.Replace(">", ")");
        //data = data.Replace("&", "");
        //return data;
        string result = "";
        Regex match = new Regex(@"[0-9a-zA-Z\u4e00-\u9fa5]", RegexOptions.IgnoreCase);
        for (int i = 0; i < input.Length; i++)
        {
            string digit = input.Substring(i, 1);
            if (match.IsMatch(digit)
                || digit == "."
                || digit == "_"
                || digit == "-"
                || digit == " ")
            {
                result += digit;
            }
        }
        return result;
    }


    public static string EscapeFullFileName(string input)
    {
        //data = data.Replace("\\", "");
        //data = data.Replace("/", "");
        //data = data.Replace("\"", "");
        //data = data.Replace("'", "");
        //data = data.Replace("<", "(");
        //data = data.Replace(">", ")");
        //data = data.Replace("&", "");
        //return data;
        string result = "";
        Regex match = new Regex(@"[0-9a-zA-Z\u4e00-\u9fa5]", RegexOptions.IgnoreCase);
        for (int i = 0; i < input.Length; i++)
        {
            string digit = input.Substring(i, 1);
            if (match.IsMatch(digit)
                || digit == "."
                || digit == "_"
                || digit == "-"
                || digit == " "
                || digit == "/")
            {
                result += digit;
            }
        }
        return result;
    }

    public static string HtmlEncode(string data)
    {
        return Microsoft.Security.Application.Encoder.HtmlEncode(data);
    }

    public static string EscapeLog(string data)
    {
        data = data.Replace("\r", "");
        data = data.Replace("\n", "");
        return data;
    }


    public static string EscapeHeader(string input)
    {
        string result = input;
        result = result.Replace("\r", "");
        result = result.Replace("\n", "");
        result = result.Replace("=", "");
        return result;
    }

    public static string EscapeCostCenterName(string input)
    {
        string result = "";
        Regex match = new Regex(@"[0-9a-zA-Z\u4e00-\u9fa5]", RegexOptions.IgnoreCase);
        for (int i = 0; i < input.Length; i++)
        {
            string digit = input.Substring(i, 1);
            if (match.IsMatch(digit) || digit == " ")
            {
                result += digit;
            }
        }
        return result;
    }

    public static string EscapeInteger(string input)
    {
        string result = "";
        Regex match = new Regex("[0-9]", RegexOptions.IgnoreCase);
        for (int i = 0; i < input.Length; i++)
        {
            string digit = input.Substring(i, 1);
            if (match.IsMatch(digit))
            {
                result += digit;
            }
        }
        return result;
    }

    public static string EscapeName(string input)
    {
        string result = "";
        Regex match = new Regex(@"[0-9a-zA-Z\u4e00-\u9fa5]", RegexOptions.IgnoreCase);
        for (int i = 0; i < input.Length; i++)
        {
            string digit = input.Substring(i, 1);
            if (match.IsMatch(digit) || digit == " ")
            {
                result += digit;
            }
        }
        return result;
    }

    public static string EscapeDate(string input)
    {
        string result = "";
        Regex match = new Regex(@"[0-9]", RegexOptions.IgnoreCase);
        for (int i = 0; i < input.Length; i++)
        {
            string digit = input.Substring(i, 1);
            if (match.IsMatch(digit) || digit == "" || digit == "/" || digit == "-" || digit == ":")
            {
                result += digit;
            }
        }
        return result;
    }

    public static string EscapeEmail(string input)
    {
        string result = "";
        Regex match = new Regex(@"[0-9a-zA-Z\u4e00-\u9fa5]", RegexOptions.IgnoreCase);
        for (int i = 0; i < input.Length; i++)
        {
            string digit = input.Substring(i, 1);
            if (match.IsMatch(digit) || digit == "@" || digit == "." || digit == "_" || digit == "-")
            {
                result += digit;
            }
        }
        return result;
    }

    //    public static string MyEscape(object data)
    //    {
    //        //string test = Microsoft.Security.Application.Encoder.HtmlEncode("&<>;\"'");
    //        //string test = Microsoft.Security.Application.Encoder.HtmlEncode(" & ");

    ////<span style="font-weight: bold; ">abc<br />
    ////<span style="font-style: italic; ">asdfasdf<br />
    ////<span style="text-decoration: underline; ">sdfsadfad<br />
    ////</span></span></span><span style="color: #ff0000; ">dddsad<br />
    ////<span style="font-family: arial, helvetica, sans-serif; ">fasdf<br />
    ////</span></span><span style="font-size: 14pt; ">fasdfasdfasd</span>

    //        string[] valid_html_tags = new string[] {
    //            "a",
    //            //"abbr",
    //            //"acronym",
    //            "address",
    //            //"applet",
    //            //"area",
    //            "article",
    //            //"aside",
    //            "audio",
    //            "b",
    //            "base",
    //            "basefont",
    //            "bdi",
    //            "bdo",
    //            "big",
    //            "blockquote",
    //            //"body",
    //            "br",
    //            //"button",
    //            //"canvas",
    //            //"caption",
    //            "center",
    //            //"cite",
    //            //"code",
    //            //"col",
    //            //"colgroup",
    //            //"command",
    //            //"datalist",
    //            "dd",
    //            //"del",
    //            //"details",
    //            //"dfn",
    //            //"dialog",
    //            //"dir",
    //            "div",
    //            "dl",
    //            "dt",
    //            "em",
    //            //"embed",
    //            //"fieldset",
    //            //"figcaption",
    //            //"figure",
    //            "font",
    //            "footer",
    //            //"form",
    //            //"frame",
    //            //"frameset",
    //            "h1",
    //            "h2",
    //            "h3",
    //            "h4",
    //            "h5",
    //            "h6",
    //            //"head",
    //            //"header",
    //            "hr",
    //            //"html",
    //            "i",
    //            //"iframe",
    //            "img",
    //            //"input",
    //            //"ins",
    //            //"kbd",
    //            //"keygen",
    //            //"label",
    //            //"legend",
    //            "li",
    //            //"link",
    //            //"map",
    //            //"mark",
    //            //"menu",
    //            //"meta",
    //            //"meter",
    //            //"nav",
    //            //"noframes",
    //            //"noscript",
    //            //"object",
    //            "ol",
    //            //"optgroup",
    //            //"option",
    //            //"output",
    //            "p",
    //            //"param",
    //            "pre",
    //            //"progress",
    //            //"q",
    //            //"rp",
    //            //"rt",
    //            //"ruby",
    //            //"s",
    //            //"samp",
    //            //"script",
    //            //"section",
    //            //"select",
    //            "small",
    //            //"source",
    //            "span",
    //            "strike",
    //            "strong",
    //            "style",
    //            //"sub",
    //            //"summary",
    //            //"sup",
    //            "table",
    //            "tbody",
    //            "td",
    //            //"textarea",
    //            "tfoot",
    //            "th",
    //            "thead",
    //            //"time",
    //            //"title",
    //            "tr",
    //            //"track",
    //            "tt",
    //            "u",
    //            "ul",
    //            //"var",
    //            //"video",
    //            //"wbr",
    //            "o:p", //come from word
    //            "!--"
    //            };

    //        string[] valid_encoded_tag = new string[] {
    //            "&amp;",
    //            "&lt;",
    //            "&gt;",
    //            "&quot;",
    //            "&nbsp;",
    //            "&copy;",
    //            "&reg"
    //        };

    //        string[] invalid_tag = new string[] {
    //            ">", "&gt;",
    //            "<", "&lt;",
    //            "\"", "&quot;",
    //            "'", "'",
    //            "&", "&amp;"
    //        };

    //        string src = data == null ? "" : Convert.ToString(data);
    //        string dest = "";
    //        //string s = "";
    //        //for (int i = 0; i < src.Length; i++)
    //        //    s += "\r\n" + i.ToString() + ":'" + src.Substring(i, 1) + "'";
    //        int pos = 0;
    //        bool in_html_tag = false;
    //        while (pos < src.Length)
    //        {
    //            bool done = false;

    //            //ignore tag <o:p>
    //            if (LeftCompare(src, pos, "<o:p>"))
    //            {
    //                dest += "";
    //                pos += 5;
    //                done = true;
    //            }
    //            //ignore tag </o:p>
    //            else if (LeftCompare(src, pos, "</o:p>"))
    //            {
    //                dest += "";
    //                pos += 6;
    //                done = true;
    //            }
    //            //allow comment <!--            
    //            else if (LeftCompare(src, pos, "<!--"))
    //            {
    //                dest += "<!--";
    //                pos += 4;
    //                done = true;
    //                in_html_tag = true;
    //            }

    //            //allow html tag
    //            if (!done)
    //            {
    //                for (int i = 0; i < valid_html_tags.Length; i++)
    //                {
    //                    if (LeftCompare(src, pos, "<" + valid_html_tags[i] + " />"))
    //                    {
    //                        dest += "<" + valid_html_tags[i] + " />";
    //                        pos += valid_html_tags[i].Length + 4;
    //                        done = true;
    //                        break;
    //                    }
    //                    else if (LeftCompare(src, pos, "<" + valid_html_tags[i] + "/>"))
    //                    {
    //                        dest += "<" + valid_html_tags[i] + "/>";
    //                        pos += valid_html_tags[i].Length + 3;
    //                        done = true;
    //                        break;
    //                    }
    //                    else if (LeftCompare(src, pos, "<" + valid_html_tags[i] + ">"))
    //                    {
    //                        dest += "<" + valid_html_tags[i] + ">";
    //                        pos += valid_html_tags[i].Length + 2;
    //                        done = true;
    //                        break;
    //                    }
    //                    else if (LeftCompare(src, pos, "<" + valid_html_tags[i] + " "))
    //                    {
    //                        dest += "<" + valid_html_tags[i] + " ";
    //                        pos += valid_html_tags[i].Length + 2;
    //                        done = true;
    //                        in_html_tag = true;
    //                        break;
    //                    }
    //                    else if (LeftCompare(src, pos, "</" + valid_html_tags[i] + ">"))
    //                    {
    //                        dest += "</" + valid_html_tags[i] + ">";
    //                        pos += valid_html_tags[i].Length + 3;
    //                        done = true;
    //                        break;
    //                    }
    //                }
    //            }

    //            //allow encoded tag
    //            if (!done)
    //            {
    //                for (int i = 0; i < valid_encoded_tag.Length; i++)
    //                {
    //                    if (LeftCompare(src, pos, valid_encoded_tag[i]))
    //                    {
    //                        dest += valid_encoded_tag[i];
    //                        pos += valid_encoded_tag[i].Length;
    //                        done = true;
    //                        break;
    //                    }
    //                }                
    //            }

    //            //allow '>' and '"' in html tag
    //            if (!done)
    //            {
    //                if (src.Substring(pos, 1) == ">" && in_html_tag)
    //                {
    //                    dest += ">";
    //                    pos += 1;
    //                    done = true;
    //                    in_html_tag = false;
    //                }
    //                else if (src.Substring(pos, 1) == "\"" && in_html_tag)
    //                {
    //                    dest += "\"";
    //                    pos += 1;
    //                    done = true;
    //                }
    //            }

    //            //escape invalid tag
    //            if (!done)
    //            {
    //                for (int i = 0; i < invalid_tag.Length - 1; i += 2)
    //                {
    //                    if (LeftCompare(src, pos, invalid_tag[i]))
    //                    {
    //                        dest += invalid_tag[i + 1];
    //                        pos += invalid_tag[i].Length;
    //                        done = true;
    //                        break;
    //                    }
    //                }
    //            }

    //            //allow other char
    //            if (!done)
    //            {
    //                dest += src.Substring(pos, 1);
    //                pos += 1;
    //                done = true;
    //            }
    //        }
    //        return dest;
    //    }

    public static bool LeftCompare(string s, int start, string left)
    {
        return LeftStr(s, start, left.Length).ToUpper() == left.ToUpper();
    }

    public static string LeftStr(string s, int start, int length)
    {
        if (s.Length - start >= length)
            return s.Substring(start, length);
        else
            return s.Substring(start, s.Length - start);
    }

    //    public static string htmlencode(string str)
    //    {
    //        if (str == null || str == "")
    //            return "";
    //        str = str.Replace(">", "&gt;");
    //        str = str.Replace(" <", "&lt;");
    //        str = str.Replace(" ", "&nbsp;");
    //        str = str.Replace("  ", " &nbsp;");
    //        str = str.Replace("\"", "&quot;");
    //        str = str.Replace("\'", "&#39;");
    //        str = str.Replace("\n", " <br/> ");
    //        return str;
    //    }


    static object AuditLogLock = new object();

    public static void AuditLog(string event_message)
    {
        AuditLog(LoginUser.LoginID, event_message);
    }

    public static void AuditLog(string account, string event_message)
    {
        lock (AuditLogLock)
        {
            string curdir = HttpContext.Current.Server.MapPath(@"\");
            curdir += @"AuditLog" + Path.DirectorySeparatorChar.ToString();
            if (!Directory.Exists(curdir))
                Directory.CreateDirectory(curdir);

            FileStream fs = null;
            try
            {
                string fullname = curdir + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                fs = new FileStream(fullname, FileMode.Append);
                string content = string.Format("{0},{1},{2}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), account, event_message);
                byte[] buffer = Encoding.UTF8.GetBytes(content);
                fs.Write(buffer, 0, buffer.Length);
            }
            finally
            {
                if (fs != null)
                {
                    fs.Flush();
                    fs.Close();
                    fs = null;
                }
            }
        }
    }

    static public DBCommands2 db = new DBCommands2(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());

}
